﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

/*****************************************************************************************************************          
 Copyright © 2010 - Banco Itaú BBA S.A          
         
 contrato:  Tela que chama a tela 
            
 Histórico de Alterações:      
  18/06/2010 - Leandra Madureira	- Criacao OS375720

 *****************************************************************************************************************/

namespace ibba.src.norisk
{
    public partial class PageProdutoModalidadeImpExcel : ChildWindow
    {
        #region Variaveis

        private const string VALOR_DEFAULT = "DEFAULT";

        private List<ServiceTipoParametro.TipoParametro> _parametro;
        private List<String> _listaDeLinhas;
        private List<ServiceProdutoModalidade.ParametroProdutoModalidade> _oParProdutoModalidade;
        private List<string> array;
        private int iRet;
        int contador;

        #endregion

        public PageProdutoModalidadeImpExcel()
        {
            InitializeComponent();

            _listaDeLinhas = new List<String>();

            CarregarComboTipoParametro();

            this.cboFormato.Items.Add("Excel (.csv)");
            this.cboFormato.SelectedIndex = 0;

        }

        private void btnImportarArquivo_Click(object sender, RoutedEventArgs e)
        {

            if (ValidarArquivo() == false)
            {
                this.txtNomeArquivo.Text = "";
                return;
            }

            //Importar
            ServiceFactory.GetInstance().ServiceProdutoModalidade.BeginAtualizarParametro(_oParProdutoModalidade, AppHelper.LoginUsuario, CallBackAtualizarParametroProdutoModalidade,
                                                                    ServiceFactory.GetInstance().ServiceProdutoModalidade);
        }

        public void Show(ServiceContratoOperacao.ContratoOperacao pContratoOperacao)
        {
            this.Visibility = Visibility.Visible;
            this.Show();
        }

        private void CarregarComboTipoParametro()
        {
            ServiceFactory.GetInstance().ServiceTipoParametro.BeginObterTipoParametroProdutoModalidade(CallBackObterTipoParametroProdutoModalidade,
                                                                        ServiceFactory.GetInstance().ServiceTipoParametro);
        }

        private void btnSelecionarArquivo_Click(object sender, RoutedEventArgs e)
        {
            this.tbCaminho.Text = EscolherOrigem();
        }

        private void rbProdutoModalidade_Click(object sender, RoutedEventArgs e)
        {
            CarregarComboTipoParametro();
        }


        private void CallBackObterTipoParametroProdutoModalidade(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _parametro = ((ServiceTipoParametro.ITipoParametro)pAsyncResult.AsyncState).EndObterTipoParametroProdutoModalidade(pAsyncResult);
                this.cboParametro.ItemsSource = _parametro;
            });
        }

        private bool ValidarArquivo()
        {

            bool bConsistencia;

            bConsistencia = true;
            string sErro = "";
            ServiceTipoParametro.TipoParametro pParametro;
            _oParProdutoModalidade = new List<ServiceProdutoModalidade.ParametroProdutoModalidade>();

            ServiceProdutoModalidade.ParametroProdutoModalidade pParProdutoModalidade;
            pParProdutoModalidade = new ServiceProdutoModalidade.ParametroProdutoModalidade();

            if (this.cboParametro.SelectedItem == null)
            {
                //Exibe mensagem para usuário selecionar um tipo de parâmetro
                MessageBoxHelper.ShowWarning("Aviso", "Deve ser selecionado um tipo de parâmetro.");

                return false;
            }

            if (this.txtNomeArquivo.Text.Trim().Length == 0)
            {
                //Exibe mensagem para usuário selecionar um tipo de parâmetro
                MessageBoxHelper.ShowWarning("Aviso", "Deve ser selecionado um arquivo.");
                return false;
            }

            int i;
            float fOut;
            char[] delimiterChars = { ';' };
            i = 0;

            contador = _listaDeLinhas.Count;

            pParametro = (ServiceTipoParametro.TipoParametro)this.cboParametro.SelectedItem;

            while (contador != 0)
            {
                //produto modalidade
                // * 1 - O arquivo deve estar no seguinte formato:*/
                array = new List<string>(_listaDeLinhas[i].Split(delimiterChars));

                if (i == 0)
                {
                    /*Coluna A - CD_PRODUTO - texto
                    Coluna B - CD_MODALIDADE - texto
                    Coluna C - VL_PARAMETRO - numérico*/
                    if ((array[0].Trim() != "PRODUTO") || (array[1].Trim() != "MODALIDADE") || (array[4].Trim() != "PARAMETRO"))
                    {
                        sErro = ", o arquivo não está formato correto";
                        bConsistencia = false;
                    }
                }
                else
                {
                    if ((array[0].Trim() == "") || (array[1].Trim() == "") || (array[2].Trim() == ""))
                    {
                        sErro = ", código produto, código modalidade ou valor do parâmetro não preenchidos.";
                        bConsistencia = false;
                    }
                    else if (float.TryParse(array[4].Trim(), out fOut) == false && (array[4].Trim() != ""))
                    {
                        sErro = ", a quinta coluna da planilha deve ser numérica.";
                        bConsistencia = false;
                    }
                    else if (fOut < 0)
                    {
                        sErro = ", o valor informado na quinta coluna da planilha deve ser positivo.";
                        bConsistencia = false;
                    }
                }

                if (bConsistencia == true)
                {
                    if (i != 0)
                    {
                        pParProdutoModalidade = new ServiceProdutoModalidade.ParametroProdutoModalidade();

                        pParProdutoModalidade.CodProduto = array[0].Trim();
                        pParProdutoModalidade.CodModalidade = array[1].Trim();
                        pParProdutoModalidade.valor = array[4].Trim();
                        pParProdutoModalidade.IdParametro = pParametro.CodParametro;

                        _oParProdutoModalidade.Add(pParProdutoModalidade);
                    }
                }
                else
                {
                    MessageBoxHelper.ShowWarning("Aviso", "Arquivo inválido " + sErro);
                    return false;
                }

                i += 1;
                contador = contador - 1;

            }

            return true;

        }

        /// <summary>
        /// Este método retorna o arquivo de origem para importação
        /// </summary>
        /// <returns></returns>
        private String EscolherOrigem()
        {
            OpenFileDialog dlg = new OpenFileDialog();
            string strNome = "";

            // Limpa campos da tela
            txtNomeArquivo.Text = "";
            this.tbCaminho.Text = "";

            // Configura o FileDialog
            dlg.Multiselect = false;
            //dlg.Filter = "All files (*.xls)|*.xls";
            dlg.Filter = "All files (*.csv)|*.csv";

            // Ativa o FileDialog para selecionar um arquivo
            bool? retval = dlg.ShowDialog();

            dlg.Multiselect = false;

            if (retval != null && retval == true)
            {

                this.txtNomeArquivo.Text = dlg.File.Name;

                //Abrir o arquivo
                string sLine;

                _listaDeLinhas = new List<string>();
                try
                {

                    if (retval == true)
                    {
                        contador = 0;

                        System.IO.Stream fileStream = dlg.File.OpenRead();
                        using (System.IO.StreamReader reader = new System.IO.StreamReader(fileStream))
                        {			// Read the first line from the file and write it the textbox.		                    
                            while (reader.Peek() != -1)
                            {
                                sLine = reader.ReadLine();
                                sLine = sLine.Replace("%", "");
                                _listaDeLinhas.Add(sLine);
                                contador += 1;
                            }
                        }
                        strNome = txtNomeArquivo.Text;
                        fileStream.Close();
                    }
                }

                catch
                {
                    this.txtNomeArquivo.Text = "";
                    MessageBoxHelper.ShowErro("Erro", "Não foi possível selecionar o arquivo! Verifique se o arquivo está aberto ou sendo usado por outro processo.", null);
                    return "";
                }



            }

            return strNome;
        }

        private void btnFechar_Click(object sender, RoutedEventArgs e)
        {
            this.txtNomeArquivo.Text = "";
            this.cboParametro.SelectedItem = "";

            this.Close();
        }

        private void CallBackAtualizarParametroProdutoModalidade(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                iRet = ((ServiceProdutoModalidade.IProdutoModalidade)pAsyncResult.AsyncState).EndAtualizarParametro(pAsyncResult);

                if (iRet != 0)
                {
                    MessageBoxHelper.ShowSucess("Sucesso", "Arquivo importado com sucesso.");
                }
                else
                {
                    MessageBoxHelper.ShowErro("Erro", "Erro no momento da importação.", null);
                }
            });
        }

    }
}